from apps.standard_domain_convert import *
from apps.supp_domain_convert import supp_domain_convert
from apps.utils import *
from apps.logger_config import logger


# 进行SDTM转换的入口类
def sdtm_convert(project_id, path):
    """
    (1) 读取上传的原始数据集， 得到一个字典dataset_df_dic: key为sheet_name, value为DataFrame
    (2) 获取本项目的所有SDTM域
    (3) 进行域的转换: 先转换标准域， 如果对应的补充数据集存在，则转换补充数据集
    """

    # 1.读取原始数据集,得到合并后的一个字典（因为可能有多个数据集）
    # 目前只支持所有数据集的sheet名称都不一致的情况
    # 遇到数据集之间的sheet名称重复的情况目前没法处理， 因为此时需要合并两个DataFrame, 但是合并DataFrame需要根据关键变量作为链接列（唯一标识一行数据）
    # 而有些关键变量是衍生变量，此时还并未生成，所以暂时不考虑多个数据集重复sheet名称的情况
    # key: 表名  value: 表格数据对应的DataFrame
    dataset_df_dic = get_combined_dataframe(project_id)

    # 域和表名的对应字典 key: domain  value: sheet_name_list
    # 表和域的对应字典 key: sheet_name  value: domain
    domain_to_sheet_dict, sheet_to_domain_dict = sheet_parse(dataset_df_dic)

    # 2. 获取所有需要转换的域
    domain_lst = get_all_domain(project_id)

    # 标准域进行转换时，需要写入补充数据集中的内容， 例如字段多选、超长文本
    # key: domain  value: DataFrame
    extra_supp_domain_df_dic = {}

    # 3. 遍历所有域，进行转换
    for domain in domain_lst:
        # 标准域且有对应的原始数据集sheet
        if not domain.startswith("SUPP") and domain_to_sheet_dict.keys().__contains__(domain):
            sheet_list = domain_to_sheet_dict[domain]
            try:
                # 3.1 标准域转换
                domain_convert(path, dataset_df_dic, project_id, domain, sheet_list, sheet_to_domain_dict, extra_supp_domain_df_dic)
            except Exception as e:
                logger.error("标准域%s转换失败， 错误原因：%s", domain, str(e))

            supp_domain = 'SUPP' + domain
            if supp_domain in domain_lst:
                try:
                    # 3.2 补充域转换
                    supp_domain_convert(path, dataset_df_dic, project_id, domain, extra_supp_domain_df_dic)
                except Exception as e:
                    logger.error("补充域%s转换失败， 错误原因：%s", supp_domain, str(e))

    # 4. 删除第一张默认添加的表格"Sheet"
    remove_first_sheet(path)
    return path


if __name__ == '__main__':
    project_id = "86af5e3968c9455aad692acf7037f29b"
    sdtm_convert(project_id, "")
